package com.cskaoyan.javase.object._7wrapper._2usecase;

/**
 * 包装类型和它对应的基本数据类型的使用
 * 在绝大多数情况下,可以互相替换,没有任何区别.
 * 当然这依赖于Java的自动装箱拆箱机制.
 *
 * 拆箱和装箱的概念：
 * 1. 在Java当中，把基本数据类型变量，转换为其对应包装类的引用数据类型变量，称之为"装箱"。
 * 2. 在Java当中，把包装类的引用数据类型类型变量，转换为其对应基本数据类型变量，称之为"拆箱"。
 * 实际代码使用中，Java中的"拆箱"和"装箱"都是自动进行的，基本数据类型变量和它的包装类引用数据类型变量，可以自由、自动的互相转换。
 *
 * 当然，所谓自动拆装箱也并不是十分高端的语法设计
 * 实际上是依赖于底层自动调用方法去实现的。
 * 自动装箱和拆箱其实是一种语法糖，在底层自动调用了方法而已：
 *      1.装箱依赖于每个包装类型的valueOf静态成员方法.
 *      2.拆箱依赖于每个包装类型的对象的"对应基本数据类型Value()"方法
 *
 * @since 09:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Integer a = 120;
        // Unnecessary boxing 'Integer.valueOf(120)'
        // 装箱是自动的,不必要写出来
        Integer i = Integer.valueOf(120);

        // Unnecessary unboxing 'a.intValue()'
        // 拆箱是自动的,不必要写出来
        int num = a.intValue();
        int num2 = a;

        // getMaxValueByIntArr(null);

    }

    /*
        求一个int类型数组中元素的最大值
        该方法的形参是传入一个数组对象
        但是这个数组可能不是正常的数组:
            1.长度为0的数组
            2.null

     */
    public static int getMaxValueByIntArr(int[] arr) {
        if (arr == null || arr.length == 0) {
            System.out.println("输入的数组不是正常数组,请重新输入!");
            /*
                这里的return不太好写了
                普遍开发中遇到这种情况有两种做法:
                    1.用int类型的包装类型Integer替代int作为返回值类型
                        依赖于自动拆装箱 可以和int互相替代使用
                    2.(扩展)比上述做法更常用的是 抛出异常结束方法.
             */
            // return null;
            throw new IllegalArgumentException("输入的数组不是正常数组,请重新输入!");
        }
        int max = arr[0];
        for (int num : arr) {
            if (num > max) {
                max = num;
            }
        }
        return max;
    }
}
